package controller;

import bo.AcaoGrupoBO;
import bo.UsuarioBO;
import bo.UsuarioGrupoBO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import model.AcaoGrupo;
import model.Usuario;
import model.UsuarioAcao;
import model.UsuarioGrupo;
import util.ConsUtil.Operacao;
import util.CustomException;
import util.FacesUtil;

@ManagedBean(name = "usuarioController")
@ViewScoped
public class UsuarioController implements Serializable {

    private UsuarioBO usuarioBO = new UsuarioBO();
    private UsuarioGrupoBO usuarioGrupoBO = new UsuarioGrupoBO();
    private AcaoGrupoBO acaoGrupoBO = new AcaoGrupoBO();
    private Operacao operacao;
    private List<Usuario> usuarios;
    private List<Usuario> usuariosFiltrados;
    private Usuario usuarioSelecionado = new Usuario();
    private List<UsuarioAcao> usuarioAcoes;
    private List<UsuarioAcao> usuarioAcoesPorGrupo;
    private List<UsuarioAcao> usuarioAcoesPorGrupoFiltrados;
    private List<UsuarioGrupo> usuarioGrupos;
    private List<AcaoGrupo> acaoGrupos;
    private AcaoGrupo acaoGrupoSelecionado;
    private String novaSenha = "";

    public UsuarioController() {
        try {
            this.usuarios = usuarioBO.selecionarTodos();
            this.operacao = Operacao.CONSULTAR;
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void carregarAcoesPorGrupo() {
        setUsuarioAcoesPorGrupo(new ArrayList());
        for (UsuarioAcao usuarioAcao : getUsuarioAcoes()) {
            if (usuarioAcao.getAcao().getAcaoGrupo().getAgrCodigo() == getAcaoGrupoSelecionado().getAgrCodigo()) {
                getUsuarioAcoesPorGrupo().add(usuarioAcao);
            }
        }
    }

    public void novo() {
        try {
            setNovaSenha("");
            setUsuarioSelecionado(new Usuario());
            getUsuarioSelecionado().setUsuBloqueado(false);
            getUsuarioSelecionado().setUsuPermissaoPorGrupo(true);
            setUsuarioGrupos(usuarioGrupoBO.selecionarTodos());
            if (!getUsuarioGrupos().isEmpty()) {
                getUsuarioSelecionado().setUsuarioGrupo(getUsuarioGrupos().get(0));
            }
            setAcaoGrupos(acaoGrupoBO.selecionarTodos());
            if (!getAcaoGrupos().isEmpty()) {
                setAcaoGrupoSelecionado(getAcaoGrupos().get(0));
            }
            setUsuarioAcoes(usuarioBO.selecionarAcoesPorNovoUsuario(getUsuarioSelecionado()));
            carregarAcoesPorGrupo();
            setOperacao(Operacao.NOVO);
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void alterar() {
        try {
            setNovaSenha("");
            Long usuCodigo = Long.valueOf(FacesUtil.getRequestParameterMap("usuCodigo"));
            setUsuarioSelecionado(usuarioBO.selecionarPorId(usuCodigo));
            getUsuarioSelecionado().setUsuarioGrupo(usuarioGrupoBO.selecionarPorId(getUsuarioSelecionado().getUsuarioGrupo().getUgrCodigo()));
            setUsuarioGrupos(usuarioGrupoBO.selecionarTodos());
            setAcaoGrupos(acaoGrupoBO.selecionarTodos());
            if (!getAcaoGrupos().isEmpty()) {
                setAcaoGrupoSelecionado(getAcaoGrupos().get(0));
            }
            setUsuarioAcoes(usuarioBO.selecionarAcoesPorUsuario(getUsuarioSelecionado()));
            carregarAcoesPorGrupo();
            setOperacao(Operacao.ALTERAR);
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void excluir() {
        try {
            setNovaSenha("");
            Long usuCodigo = Long.valueOf(FacesUtil.getRequestParameterMap("usuCodigo"));
            setUsuarioSelecionado(usuarioBO.selecionarPorId(usuCodigo));
            getUsuarioSelecionado().setUsuarioGrupo(usuarioGrupoBO.selecionarPorId(getUsuarioSelecionado().getUsuarioGrupo().getUgrCodigo()));
            setUsuarioGrupos(usuarioGrupoBO.selecionarTodos());
            setAcaoGrupos(acaoGrupoBO.selecionarTodos());
            if (!getAcaoGrupos().isEmpty()) {
                setAcaoGrupoSelecionado(getAcaoGrupos().get(0));
            }
            setUsuarioAcoes(usuarioBO.selecionarAcoesPorUsuario(getUsuarioSelecionado()));
            carregarAcoesPorGrupo();
            setOperacao(Operacao.EXCLUIR);
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void salvar() {
        try {
            if (!novaSenha.isEmpty()) {
                usuarioSelecionado.setUsuSenha(novaSenha);
            }
            usuarioBO.salvar(usuarioSelecionado, usuarioAcoes);
            setUsuarios(usuarioBO.selecionarTodos());
            setOperacao(Operacao.CONSULTAR);
            FacesUtil.exibirMsgInfo(null, "Concluído", "Usuário salvo com sucesso!");
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void confirmarExclusao() {
        try {
            usuarioBO.excluir(usuarioSelecionado);
            setUsuarios(usuarioBO.selecionarTodos());
            setOperacao(Operacao.CONSULTAR);
            FacesUtil.exibirMsgInfo(null, "Concluído", "Usuário excluído com sucesso!");
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public Operacao getOperacao() {
        return operacao;
    }

    public void setOperacao(Operacao operacao) {
        this.operacao = operacao;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Usuario getUsuarioSelecionado() {
        return usuarioSelecionado;
    }

    public void setUsuarioSelecionado(Usuario usuarioSelecionado) {
        this.usuarioSelecionado = usuarioSelecionado;
    }

    public List<Usuario> getUsuariosFiltrados() {
        return usuariosFiltrados;
    }

    public void setUsuariosFiltrados(List<Usuario> usuariosFiltrados) {
        this.usuariosFiltrados = usuariosFiltrados;
    }

    public List<UsuarioAcao> getUsuarioAcoes() {
        return usuarioAcoes;
    }

    public void setUsuarioAcoes(List<UsuarioAcao> usuarioAcoes) {
        this.usuarioAcoes = usuarioAcoes;
    }

    public List<UsuarioGrupo> getUsuarioGrupos() {
        return usuarioGrupos;
    }

    public void setUsuarioGrupos(List<UsuarioGrupo> usuarioGrupos) {
        this.usuarioGrupos = usuarioGrupos;
    }

    public List<AcaoGrupo> getAcaoGrupos() {
        return acaoGrupos;
    }

    public void setAcaoGrupos(List<AcaoGrupo> acaoGrupos) {
        this.acaoGrupos = acaoGrupos;
    }

    public AcaoGrupo getAcaoGrupoSelecionado() {
        return acaoGrupoSelecionado;
    }

    public void setAcaoGrupoSelecionado(AcaoGrupo acaoGrupoSelecionado) {
        this.acaoGrupoSelecionado = acaoGrupoSelecionado;
    }

    public List<UsuarioAcao> getUsuarioAcoesPorGrupo() {
        return usuarioAcoesPorGrupo;
    }

    public void setUsuarioAcoesPorGrupo(List<UsuarioAcao> usuarioAcoesPorGrupo) {
        this.usuarioAcoesPorGrupo = usuarioAcoesPorGrupo;
    }

    public List<UsuarioAcao> getUsuarioAcoesPorGrupoFiltrados() {
        return usuarioAcoesPorGrupoFiltrados;
    }

    public void setUsuarioAcoesPorGrupoFiltrados(List<UsuarioAcao> usuarioAcoesPorGrupoFiltrados) {
        this.usuarioAcoesPorGrupoFiltrados = usuarioAcoesPorGrupoFiltrados;
    }

    public String getNovaSenha() {
        return novaSenha;
    }

    public void setNovaSenha(String novaSenha) {
        this.novaSenha = novaSenha;
    }
}
